[レポート]シンボリック実行とテイント解析によるWDMドライバーの脆弱性ハンティングの強化 – CODE BLUE 2023 #codeblue_jp
こんにちは、臼田です。
みなさん、セキュリティ対策してますか?(挨拶
今回はCODE BLUE 2023で行われた以下のセッションのレポートです。
シンボリック実行とテイント解析によるWDMドライバーの脆弱性ハンティングの強化
WDM ドライバーの脆弱性検出は、ドライバーがクローズドソースであることと、ドライバーをカーネルにロードするために特定の環境が必要であることから、困難な場合がる。シンボリック実行とテイント解析は、ソフトウェアセキュリティにおいて一般的な手法だが、プログラムの複雑さに応じて実行可能なパスと潜在的に汚染された入力(Tainted inputs)が指数関数的に増加する、パスの爆発(Path explosion)とテイントの爆発(Taint explosion)の問題に悩まされることがある。
この講演では、IOCTLanceと呼ばれる解決策を提案する。これは、WDMドライバーの脆弱性を検出するために、シンボリック実行とテイント解析を使用する。ターゲットの入力バッファを汚染(Tainting)し、パス爆発問題を緩和するためのカスタム可能なオプションを開発することにより、IOCTLanceはWDMドライバーのさまざまな種別の脆弱性を検出することができる。26のドライバーで117の未知の脆弱性を発見し、サービス拒否や不十分なアクセス制御、権限昇格の脆弱性を含む41のCVEが発行された。
Presented by : ゼゼ・リン - Zeze Lin
レポート
- TeamT5のリサーチャー
- 現在Windowsカーネルのハンティングをしている
- WDMドライバとIOCTLanceの紹介
- Windows Driver Model
- Windows 2000からある
- Windowsのカーネルドライバの殆どで使われている
- たくさんの脆弱性が発見されている
- 作り方
- IoCreateDevice
- シンボリックリンクを作る
- IRPのディスパッチルーティンを定義する
- IRP_MJ_DEVICE_CONTROLにフォーカスする
- IRPはI/O Request Packet
- IRPからWindows APIをcallする
- IOCTL
- Device Input and Output Control
- BYOVDアタック
- Bring Your Own Vulnerable Driver
- 脆弱性のあるドライバを利用する
- アンチマルウェアをバイパスする
- 残念ながら脆弱性のあるものがたくさんある
- Symbolic Execution
- 静的な診断に使う
- Tint Analysis
- 信頼できないデータを特定する
- IOCTLance
- 効率的に脆弱性を特定できる
- 117の脆弱性が26のドライバで特定
- 関連されたワーク
- Fuzzing
- Fuzzing + Symbolic Execution
- Symbolic Execution + Taint analysis
- パスエクスプロージョンの問題がある
- IOCTLanceの設計
- DriverがIOCTLanceにロードされる
- 調査
- WDM Driverか確認する
- Device Nameを収集
- OPコードなどの情報を探知
- 処理
- 動かす
- パフォーマンスを改善する
- オプションもみる
- IOCTLハンドラの検知
- DEVICE_IO_CONTROL
- 脆弱性ハント
- 9つの脆弱性をハントする
- 見つけた種類をレポートする
- 調査
- DriverがIOCTLanceにロードされる
- 実際の事例
- Map Physical Memory
- MmMapIoSpace
- コントロール可能なものを発見する
- 物理アドレスをコントロールできる
- ZwMapViewOfSection
- ベースアドレスがコントロール可能なのか確認する
- 条件が満たされると権限昇格できる
- CVE-2023-1679
- Controllable Process Handle
- ZwOpenProcess
- 任意のプロセスハンドルを取得できる
- ObOpenObjectByPointer
- 条件を満たすとアクセスコントロールが不十分であると判断できる
- CVE-2023-1445
- Buffer Overflow
- memcpy
- パラメータサイズがコントロールできるか確認
- CVE-2023-1646
- stack overflowをみつけた
- Null Pointer Dereference
- tainted Buffer
- inbufの検証なし
- サービス拒否につながる
- CVE-2023-1638
- IObit Malware Fiter
- Read/Write Controllable Address
- memcpyの書き込み先がコントロールできるか確認する
- CVE-2023-20562
- Arbitrary Shellcode Execution
- Breakpoint: Call
- 任意のコールができる
- Arbitrary Wrmsr
- 任意のカーネル実行につながる
- CVE-2023-1489
- Arbitrary Out
- opcodeのportとdataがフックできればできる
- CVE-2023-2870
- Dangerous File Operation
- ファイルオペレーション関係にフックする
- ObjectNameが利用できてOBJ_FORCE_ACCESS_CHECKでなければ攻撃につながる
- CVE-2023-1453
- Map Physical Memory
- どういったところを改善したのか
- Opcodeの改善
- rep
- 繰り返し実行するもの
- シンボリックの変数なのか
- メモリを使いすぎていないか確認
- indirect jump
- call
- symbolic function addressに制約をつける
- Improve Functions
- Constraints
- バッファを評価してread/writeで使えるか
- バッファがreadできるか、ユーザーモードで利用できるか
- Bypass Checks
- いくつかのAPIで環境を評価する
- 実行し続けていいか確認する
- PsGetVersionなどを使う
- MmGetSystemRoutineAddressなどにも使う
- Customization
- ケースバイケースの問題を解決する
- 長さ制限
- ループバウンド
- トータルタイムアウト
- IoControl Codeのタイムアウト
- Recursion
- Symbolize Data Section
- Opcodeの改善
- Evaluation
- Known Drivers
- 既知の脆弱なドライバを取得する
- IOCTLanceを使うことで既知のものの殆どを検知できる
- 偽陽性があるが、カスタマイズで調整できる
- そして117の未知の脆弱性を検知できた
- 脆弱性を見つけたらマニュアルで調査していく必要がある
- 場合によっては脆弱性が重要ではないことがある
- try-exceptにあるばあい
- 別の検証がある場合
- 本当に脆弱性を実行するのは難しいこともある
- ベンダーはレポートを怖がっている
- 場合によっては脆弱性が重要ではないことがある
- Known Drivers
- 結論
- WDMドライバにはセキュリティリスクが有る
- IOCTLanceは9つの脆弱性の種類をターゲットにしている
- 結果として41のCVEを見つけている
感想
脆弱性を発見するためのツール化も一筋縄ではいかないですね。
最適化手法など参考になります。